package com.hsj.boot.config;


import com.alibaba.druid.FastsqlException;
import com.hsj.boot.bean.Cat;
import com.hsj.boot.bean.Dog;
import com.hsj.boot.bean.User;
import com.hsj.boot.properties.AddressProperties;
import com.hsj.boot.properties.UrlProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration   //他俩其实一样 只是为了区分 我们自己写的一些通用的配置
//@SpringBootApplication  //springboot的 只是为了区分 springboot的配置
//@Import(FastsqlException.class)   //和@Bean的功能类似  导入一些类到容器中
//@ConditionalOnClass(value = "com.alibaba.druid.FastsqlException")  如果这个注解在类似行 就表示当满足时这个配置类才会生效， 如果不满足 整个配置类都不会生效
@EnableConfigurationProperties(AddressProperties.class)  //这个注解做了两部，1 把AddressProperties放入容器 2.会将其和配置文件进行绑定。
public class AppConfig {
    /**
     * 给容器中 放入一个对象， 并把对象的属性给赋值了， 如果需要用这个对象 只需要从容器中拿就可以
     */
    @Bean
    public User user() {
        User user = new User();
        user.setId(1L);
        user.setName("zhangSan");
        return user;
    }

    /**
     * 为什么要用@Bean 这种方式导入一些对象呢？  因为对于我们引入的一些第三方jar包，我们要用到它里面的对象，并给它属性赋值，
     * 但是我们无法操作jar包里的类，无法给他添加例如 @Component 把它放到我们的spring容器中
     * 就可以通过@Bean的方式 把这个对象给放进来，如下 。也可以通过  @Import(FastsqlException.class)  把这个类到进来.当然@Import必须得写在@configuration这个配置类上
     * 注意： - @Bean 导入的对象  名字默认是  方法名 例如下面的方法 放到容器的对象叫 fastsqlException
     * - @Import(FastsqlException.class)  导入到容器的对象 名字叫 FastsqlException 全类名
     */
    @Bean
    public FastsqlException fastsqlException() {
        return new FastsqlException();
    }


    @Bean
    @ConditionalOnBean(User.class)  //条件配置，当容器中存在User这个类的对象才会把Cat放进来
//    @ConditionalOnClass(FastsqlException.class)//如果容器中存在FastsqlException这个类，才会把Cat放进来
    @ConditionalOnClass(name = "com.alibaba.druid.FastsqlException")  //跟上面一样，只不过 一个是全类名 一个是类名
    public Cat cat() {
        return new Cat();
    }
    //只要pom文件 导了 druid 这个包 就会有FastsqlException这个类，如果有这个类就有把Cat创建放到容器，如果没有就会有dog创建放到容器
    @Bean
    @ConditionalOnMissingClass(value = "com.alibaba.druid.FastsqlException") //当容器中不存在FastsqlException这个类，才会把Dog放进来
    public Dog dog(){
        return new Dog();
    }

//    @Bean
//    @ConfigurationProperties(prefix = "band-properties-url")  //属性绑定 和 在这个urlProperties类上 加@Component 和  @ConfigurationProperties(prefix = "band-properties-url") 效果是一样的
//    public UrlProperties urlProperties(){
//        return new UrlProperties();
//    }





}
